home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 79 / maccd 79.iso / multimedial / GL Tron / Source / gltron / software.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-13  |  3.1 KB  |  116 lines  |  [TEXT/CWIE]

  1. #include "gltron.h"
  2.  
  3. typedef struct {
  4.   int size;
  5.   int lower;
  6.   int upper;
  7.   int channels;
  8.   unsigned char **glyphs;
  9. } bitmapFont;
  10.  
  11. static list *bitmapFonts = NULL;
  12.  
  13. void deleteBitmaps(gDisplay *d) {
  14.   /* keep bitmapFonts around */
  15.   fbmpUnloadFont(d->bitfont);
  16.   free(d->pixelGui);
  17. }
  18.  
  19. void initBitmaps(gDisplay *d) { 
  20.   /* must be called before usage of bitmap stuff */
  21.   if(bitmapFonts == NULL) {
  22.       bitmapFonts = (list*) malloc(sizeof(list));
  23.       bitmapFonts->next = NULL;
  24.   }
  25.   d->bitfont = fbmpLoadFont("test.fbmp");
  26.   d->pixelGui = loadPixels("gltron_bitmap.png", d);
  27. }
  28.  
  29. bitmapFont* makeBitmapFont(fontbmp *fbmp, int size) {
  30.   bitmapFont *font;
  31.   int i;
  32.  
  33.   font = (bitmapFont*) malloc(sizeof(bitmapFont));
  34.   font->lower = fbmp->lower;
  35.   font->upper = fbmp->upper;
  36.   font->size = size;
  37.   font->channels = fbmp->tex->channels;
  38.   font->glyphs = (unsigned char**) malloc( (font->upper - font->lower) * (sizeof(unsigned char*)) );
  39.   for(i = 0; i < font->upper - font->lower; i++) {
  40.     int x, y;
  41.     x = (i % ( fbmp->texwidth / fbmp->width )) * fbmp->width;
  42.     y = fbmp->texwidth - fbmp->width - 
  43.       (i / ( fbmp->texwidth / fbmp->width )) * fbmp->width;
  44. #ifndef BITMAP
  45.     font->glyphs[i] = scalePixels(fbmp->tex->data,
  46.                   fbmp->texwidth, fbmp->texwidth,
  47.                   x, y, fbmp->width, fbmp->width,
  48.                   size, size, font->channels);
  49. #endif
  50. #ifdef BITMAP
  51.     font->glyphs[i] = scalePixelBitmap(fbmp->tex->data,
  52.                   fbmp->texwidth, fbmp->texwidth,
  53.                   x, y, fbmp->width, fbmp->width,
  54.                   size, size, font->channels);
  55. #endif
  56.   }
  57.   return font;
  58. }
  59.  
  60. bitmapFont* getBitmapFont(int size) {
  61.   list *p;
  62.  
  63.   for(p = bitmapFonts; p->next != NULL; p = p->next) {
  64.     if( ((bitmapFont*) p->data)->size == size)
  65.       return (bitmapFont*) p->data;
  66.   }
  67.   p->next = (list*) malloc(sizeof(list));
  68.   p->next->next = NULL;
  69.   printf("making new bitmapfont of size %d\n", size);
  70.   p->data = makeBitmapFont(game->screen->bitfont, size);
  71.   return (bitmapFont*) p->data;
  72. }
  73.  
  74. void drawSoftwareHighlight(int x, int y, int size, char *text) {
  75. #define PADDING 5
  76.   glBegin(GL_LINE_LOOP);
  77.   glVertex2i(x - PADDING, y - PADDING);
  78.   glVertex2i(x + PADDING + strlen(text) * size, y - PADDING);
  79.   glVertex2i(x + PADDING + strlen(text) * size, y + PADDING + size);
  80.   glVertex2i(x - PADDING, y + PADDING + size);
  81.   glEnd();
  82. }
  83.  
  84. void drawSoftwareText(fonttex *tex, int x, int y, int size, char *text) {
  85.   bitmapFont *font;
  86.   int pos = 0;
  87.   char c;
  88.  
  89.   font = getBitmapFont(size);
  90.   if(font == NULL) {
  91.     fprintf(stderr, "got null font, size %d\n", size);
  92.   } else {
  93.     while(*(text + pos) != 0) {
  94.       glRasterPos2i(x + pos * size, y);
  95.       c = *(text + pos);
  96.       if(c > font->lower && c < font->upper) {
  97.     int type;
  98.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  99.     glEnable(GL_BLEND);
  100.     type = (font->channels == 4) ? GL_RGBA : GL_RGB;
  101.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  102. #ifndef BITMAP
  103.     glDrawPixels(font->size, font->size, type, GL_UNSIGNED_BYTE,
  104.              font->glyphs[c - font->lower + 1]);
  105. #endif
  106. #ifdef BITMAP
  107.     glBitmap(font->size, font->size, 0, 0, font->size, 0,
  108.          font->glyphs[c - font->lower + 1]);
  109. #endif
  110.     glDisable(GL_BLEND);
  111.       }
  112.       pos++;
  113.     }
  114.   }
  115. }
  116.